Skip to content

框架学习_MyBatis-Plus使用

简介

MyBatis作为一款优秀的ORM(对象关系映射)框架,被广泛使用。

然而,随着项目规模的扩大和复杂度的提升,传统的MyBatis在代码量和开发效率上可能无法满足需求。为了解决这些问题,诞生了MyBatis-Plus

MyBatis-Plus(以下简称MP)是对MyBatis的增强工具,旨在以最少的代码,实现对数据库的CRUD(增删改查)操作,提升开发效率。 本篇博客将全面详解MyBatis-Plus的使用,包括其特点、安装配置、基本使用、高级功能以及最佳实践。


什么是 MyBatis-Plus

MyBatis-Plus 是 MyBatis 的增强版,它在不改变 MyBatis 原有功能的基础上,为其提供了一系列的增强功能,如:

  • CRUD 接口封装:提供了常用的 CRUD 接口,无需手写 SQL 即可实现单表的常规操作。
  • 条件构造器:通过Lambda表达式封装查询条件,防止字段名写错,增强代码可读性。
  • 分页插件:内置高效的分页插件,支持多种数据库分页。

MyBatis-Plus 的特点

  • 开箱即用:只需少量配置,即可整合到项目中使用。
  • 无侵入性:不影响已有的 MyBatis 配置和方法。
  • 扩展性强:提供了丰富的插件,如分页、代码生成器、性能分析等。
  • 支持主流数据库:如MySQL、Oracle、PostgreSQL、SQL Server等。

整合MybatisPlus

springboot + mybatisplus

环境准备

  • JDK 版本:1.8 及以上
  • Maven:项目管理工具
  • 数据库:MySQL 5.7 及以上(以 MySQL 为例)
  • IDE:IntelliJ IDEA 或其他

创建 Maven 项目

使用 IDE 新建一个 Maven 项目,选择合适的 GroupId 和 ArtifactId。

添加依赖

pom.xml 中添加 MyBatis-Plus 相关的依赖:

<dependencies>
    <!-- MyBatis-Plus 核心依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>

    <!-- Druid 数据源(可选) -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.15</version>
    </dependency>

    <!-- Spring Boot Starter(如果是 Spring Boot 项目) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

修改配置

数据库配置

application.ymlapplication.properties 中配置数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

配置 MyBatis-Plus

MyBatis-Plus 的基本配置包括 mapper 的扫描路径,具体配置如下:

mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  type-aliases-package: com.example.demo.entity

基本使用

创建实体类

创建与数据库表对应的实体类,例如,一个 User 实体:

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user") // 指定对应的数据库表名
public class User {

    @TableId // 标识主键
    private Long id;

    private String name;
    private Integer age;
    private String email;
}

创建 Mapper 接口

创建 Mapper 接口,继承自 BaseMapper<T>

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 这里可以自定义方法或使用默认提供的 CRUD 方法
}

编写 Service 层(可选)

为了更好的分层,可以创建 Service 接口和实现类:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;

public interface UserService extends IService<User> {
    // 可以自定义业务方法
}

实现类:

package com.example.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 实现自定义业务方法
}

测试 CRUD 操作

在 Controller 或测试类中使用:

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 新增用户
    @PostMapping
    public String addUser(@RequestBody User user) {
        boolean save = userService.save(user);
        return save ? "success" : "fail";
    }

    // 查询所有用户
    @GetMapping
    public List<User> getUsers() {
        return userService.list();
    }

    // 根据ID查询用户
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    // 更新用户信息
    @PutMapping
    public String updateUser(@RequestBody User user) {
        boolean update = userService.updateById(user);
        return update ? "success" : "fail";
    }

    // 删除用户
    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable Long id) {
        boolean remove = userService.removeById(id);
        return remove ? "success" : "fail";
    }
}

条件构造器

MyBatis-Plus 提供了强大的条件构造器,支持链式调用,构建复杂的查询条件。

QueryWrapper

QueryWrapper 用于构建查询条件,例如:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

// 查询年龄大于20岁的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20);
List<User> users = userService.list(queryWrapper);

LambdaQueryWrapper

LambdaQueryWrapper 使用 Lambda 表达式,更安全可靠:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

// 查询名字为 "张三" 的用户
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三");
List<User> users = userService.list(lambdaQuery);

常用条件方法

  • eq:等于
  • ne:不等于
  • gt:大于
  • ge:大于等于
  • lt:小于
  • le:小于等于
  • between:在...之间
  • like:模糊匹配
  • in:包含于
  • or:或者
  • orderBy:排序

使用示例

复杂插件

实际使用的时候可以问一下大模型,这里的复杂程度算低的

LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.eq(User::getAge, 25)
     .like(User::getName, "张")
     .orderByDesc(User::getId);

List<User> users = userService.list(query);

分页插件

MyBatis-Plus 自带分页插件,支持多种数据库。

引入分页插件

在配置类中注入分页插件:

package com.example.demo.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    // 旧版本使用 PaginationInterceptor,新版本改为 MybatisPlusInterceptor
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

使用分页查询

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

Page<User> page = new Page<>(1, 5); // 当前页,页大小
Page<User> userPage = userService.page(page);

List<User> records = userPage.getRecords();
long total = userPage.getTotal();

与条件构造器结合

LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.gt(User::getAge, 20);

Page<User> page = new Page<>(1, 5);
Page<User> userPage = userService.page(page, query);

代码生成器

MyBatis-Plus 提供了代码生成器,可快速生成实体类、Mapper、Service、Controller 等代码。

引入依赖

pom.xml 中添加:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3.1</version>
</dependency>

<!-- 代码生成器需要的模板引擎 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

编写生成器代码

创建一个 Java 类,用于执行代码生成:

package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.config.*;

public class CodeGenerator {

    public static void main(String[] args) {
        // 1. 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setAuthor("YourName")
          .setOutputDir(System.getProperty("user.dir") + "/src/main/java")
          .setOpen(false)
          .setServiceName("%sService")
          .setSwagger2(true); // 实体属性 Swagger2 注解

        // 2. 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&useSSL=false&characterEncoding=utf8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("your_username");
        dsc.setPassword("your_password");
        dsc.setDbType(DbType.MYSQL);

        // 3. 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("demo")
          .setParent("com.example");

        // 4. 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel) // 表名生成策略
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true) // 自动生成 Lombok 注解
                .setRestControllerStyle(true) // 生成 @RestController 控制器
                .setInclude("user"); // 生成的表

        // 5. 整合配置
        AutoGenerator mpg = new AutoGenerator();
        mpg.setGlobalConfig(gc)
           .setDataSource(dsc)
           .setPackageInfo(pc)
           .setStrategy(strategy)
           .setTemplateEngine(new VelocityTemplateEngine());

        // 6. 执行生成
        mpg.execute();
    }
}

执行该类的 main 方法,即可自动生成代码。


乐观锁与逻辑删除

乐观锁

MyBatis-Plus 支持乐观锁,需在实体类中加入 @Version 注解。

配置乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
}
在实体类中添加版本字段
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;

@Data
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;

    @Version
    private Integer version;
}
乐观锁更新示例
User user = userService.getById(1L);
user.setEmail("new_email@example.com");
userService.updateById(user); // 更新时,会根据 version 乐观锁版本号进行控制

逻辑删除

MyBatis-Plus 支持逻辑删除,无需真的删除数据库记录,而是在删除时更新标识。

配置逻辑删除

application.yml 中配置逻辑删除字段:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
实体类中添加逻辑删除字段
import com.baomidou.mybatisplus.annotation.TableLogic;

@Data
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableLogic
    private Integer deleted; // 逻辑删除字段
}
逻辑删除操作
userService.removeById(1L); // 实际上是更新 deleted 字段为 1

多数据源支持

MyBatis-Plus 支持多数据源配置,可根据业务需求配置多个数据源。

配置多数据源

spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/primary_db
      username: xxx
      password: xxx
    secondary:
      url: jdbc:mysql://localhost:3306/secondary_db
      username: xxx
      password: xxx

定义数据源配置类

编写配置类,指定不同的数据源。


性能分析插件

MyBatis-Plus 提供性能分析插件,可输出 SQL 语句及执行时间,便于调优。

配置性能分析插件

@Bean
public PerformanceInterceptor performanceInterceptor() {
    PerformanceInterceptor interceptor = new PerformanceInterceptor();
    interceptor.setMaxTime(1000); // 设置 SQL 执行的最大时间,超过则抛出异常
    interceptor.setFormat(true); // 是否格式化 SQL
    return interceptor;
}

参考资料